iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
SideProject30

30 天大冒險:新手勇闖 React 大秘境系列 第 9

DAY 09- 為元件加點狀態

  • 分享至 

  • xImage
  •  

⭐任務說明

😸上一個任務中學習到利用資料驅動畫面,並且拆分元件
今天將會學習到使用 React Hook 中的 useState,讓元件擁有狀態!

加點狀態!

  • 透過狀態,讓元件可以記住使用者在畫面所輸入的值,或是所選擇的項目。

  • 要使用 useState 前,先把他 import 進來

import { useState } from "react";
  • 透過 useState 紀錄一些資料狀態,寫法格式如下
const [something, setSomething] = useState(0)

😸 冒險者,這次我們要做一個切換畫面上的資訊,會有每一頁需要顯示不同的內容,
並且使用者在瀏覽的時候可以切換是否需要觀看或隱藏指內容
所以我們這邊會需要紀錄現在是第幾個(index)、 指定區塊是否要顯示(showMore)以及下一頁

  • 依照我們的情境,先做一個按下按鈕會顯示現在是第幾筆資料
  • 從簡單的開始來驗證

export default function Page() {
  const [index, setIndex] = useState(0);
  const hasNext = index < tmpList.length - 1;

  function nextClick() {
    if (hasNext) {
      setIndex(index + 1);
    } else {
      setIndex(0);
    }
  }

  return (
    <>
      <h1>React 大秘境 - DAY 09</h1>
      <button onClick={nextClick}>Next</button>
      <h2>{index + 1}</h2>
    </>
  );
}
  • 看看結果,點下 Next 後,下方的數字就會變化
  • 而我們的資料全部共有 5 筆,在程式碼中有利用當前的 index 與資料長度,如果 index 小於目前資料長度就會繼續下一頁,否則就會回到原始狀態。

img

😸 簡單驗證完按下去會有變化,再來進階一點帶點其他資料

import { useState } from "react";
import { tmpList } from "./data";
import "./styles.css";

export default function Page() {
  const [index, setIndex] = useState(0);
  const hasNext = index < tmpList.length - 1;

  function nextClick() {
    if (hasNext) {
      setIndex(index + 1);
    } else {
      setIndex(0);
    }
  }

  let tmp = tmpList[index];
  return (
    <>
      <h1>React 大秘境 - DAY 09</h1>
      <button onClick={nextClick}>Next</button>
      <h2>{index + 1}</h2>
      <div> {tmp.name} </div>
      <img src={tmp.url} alt={tmp.name} />
    </>
  );
}

  • 看看結果!看起來沒什麼問題(圖片是使用隨機圖片的服務)

img

😸 登登!來組裝一下囉

import { useState } from "react";
import { tmpList } from "./data";

export default function Page() {
  const [index, setIndex] = useState(0);
  const [showMore, setShowMore] = useState(false);
  const hasNext = index < tmpList.length - 1;

  function nextClick() {
    if (hasNext) {
      setIndex(index + 1);
    } else {
      setIndex(0);
    }
  }
  function moreClick() {
    setShowMore(!showMore);
  }

  let tmp = tmpList[index];
  return (
    <>
      <h1>React 大秘境 - DAY 09</h1>
      <button onClick={nextClick}>Next</button>
      <h2>
        <i>{tmp.name} </i>
        by {tmp.profession}
      </h2>
      <h3>
        ({index + 1} of {tmpList.length})
      </h3>
      <button onClick={moreClick}>{showMore ? "隱藏" : "顯示"}</button>
      {showMore && <p>{tmp.description}</p>}
      <img src={tmp.url} alt={tmp.name} />
    </>
  );
}

  • 結果
    img

結語

😸冒險者學會了嗎?今天學習到幫資料加點狀態,讓資料可以依照使用者的操作再多一些不同的變化,下個任務見囉!


上一篇
DAY 08 - 資料驅動元件多點變化
下一篇
DAY 10 - 多次更新的狀態
系列文
30 天大冒險:新手勇闖 React 大秘境30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
112182ssss
iT邦新手 4 級 ‧ 2023-12-02 07:38:28

覺得如果能放上data的tmpList會幫助理解,感謝

karakamin iT邦新手 3 級 ‧ 2023-12-05 23:02:23 檢舉

資料的範例我再找時間補上!感謝建議

我要留言

立即登入留言